package be.ipl.diavoloz.usecasesimpl;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Lock;
import javax.ejb.LockType;
import javax.ejb.Singleton;
import javax.ejb.Startup;

import be.ipl.diavoloz.dao.JoueurDao;
import be.ipl.diavoloz.dao.PartieDao;
import be.ipl.diavoloz.modele.Etat;
import be.ipl.diavoloz.modele.Joueur;
import be.ipl.diavoloz.modele.Partie;
import be.ipl.diavoloz.usecases.GestionPartie;
//import be.ipl.diavoloz.dao.JoueurDao;
//import be.ipl.diavoloz.dao.PartieDao;
//import be.ipl.diavoloz.modele.De;
//import be.ipl.diavoloz.modele.Joueur;
//import be.ipl.diavoloz.modele.Partie;
//import be.ipl.diavoloz.modele.Partie.Etat;

@Singleton
@Startup
public class GestionPartieImpl implements GestionPartie {
	private static int num = 0;

	@EJB
	JoueurDao joueurDao;
	@EJB
	PartieDao partieDao;
	
	
	public boolean creerUnePartie(String pseudo, String nom) {
		Joueur joueur = joueurDao.rechercherParPseudo(pseudo);
		if(joueur.getPartie() != null) return false;
		Partie partie;
		partie = new Partie(nom);
		joueur.setPartie(partie);
		joueurDao.mettreAJour(joueur);
		partie.ajouterJoueur(joueur);
		partie = partieDao.enregistrer(partie);
		return true;
	}
	
	
	@Override
	public boolean rejoindreUnePartie(String pseudo, Partie partie) {
		if (partie != null && partie.getEtat() == Etat.EN_COURS)
			return false;
		if (partie == null || partie.getEtat() == Etat.TERMINEE) {
			return false;
		}
		Joueur joueur = joueurDao.rechercherParPseudo(pseudo);
		if(joueur.getPartie() != null) return false;	
		partie = partieDao.rechercher(partie.getId());
		joueur.setPartie(partie);
		joueurDao.mettreAJour(joueur);
		return partie.ajouterJoueur(joueur);
	}
	
	public List<Partie> listerPartiesEnAttente() {
		return partieDao.listerPartiesEnAttente();
	}
	
	public List<Partie> listerPartiesTerminer() {
		return partieDao.listerPartiesTerminees();
	}
	
	public List<String> listerJoueurs(Partie partie){
		if(partie == null) return null;
		List<Joueur> listeJoueurs = partie.getListeJoueurs();
		List<String> pseudos = new ArrayList<String>();
		for (Joueur joueur : listeJoueurs)
			pseudos.add(joueur.getPseudo());
		return pseudos;
	}
	
	@Override
	public boolean commencerPartie(Partie partie) {
		if (partie == null || partie.getEtat() != Etat.ATTENTE_JOUEURS)
			return false;
		partie = partieDao.rechercher(partie.getId());
		return partie.commencerPartie();
	}

	
//
//	@Override
//	@Lock(LockType.READ)
//	public List<De> listerDesJoues() {
//		if (partie == null)
//			return null;
//		partie = partieDao.rechercher(partie.getId());
//		List<De> liste = new ArrayList<De>();
//		liste.addAll(partie.getDesJouables());
//		return liste;
//	}
//
//	@Override
//	public int lancerLesDes() {
//		if (partie == null)
//			return 0;
//		partie = partieDao.rechercher(partie.getId());
//		return partie.lancerLesDes();
//	}
//

	@Override
	@Lock(LockType.READ)
	public int mesPoints(String pseudo) {
		Joueur j = joueurDao.rechercherParPseudo(pseudo);
		if (j.getPartie() == null)
			return 0;
		Partie partie = j.getPartie();
		return j.getBoulesDeCristal();
	}
//
//	@Override
//	@Lock(LockType.READ)
//	public int points(String pseudo) {
//		if (partie == null)
//			return 0;
//		partie = partieDao.rechercher(partie.getId());
//		return partie.getPoints(partie.getJoueur(pseudo));
//	}
//
//	@Override
//	public boolean auSuivant() {
//		if (partie == null)
//			return false;
//		partie = partieDao.rechercher(partie.getId());
//		return partie.commencerTourSuivant();
//
//	}
//
//	@Override
//	public String vainqueur() {
//		if (partie == null)
//			return null;
//		partie = partieDao.rechercher(partie.getId());
//		Joueur v = partie.estVainqueur();
//		if (v == null)
//			return null;
//		return v.getPseudo();
//	}
//
//	@Override
//	public boolean estFinie() {
//		if (partie == null)
//			return true;
//		partie = partieDao.rechercher(partie.getId());
//		return partie.getEtat() == Etat.FINIE;
//	}
//
//	@Override
//	public void annulerPartie() {
//		if (partie != null)
//			partie.annuler();
//	}

}
